package com.ciwong.epaper.utils;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;


public class GsonUtil {

    private static final Gson GSON = new GsonBuilder()
            .setPrettyPrinting() // 可选：美化格式
            .disableHtmlEscaping() // 不转义HTML字符
            .create();


    // 对象转 JSON 字符串
    public static String toJson(Object obj) {
        try {
            return GSON.toJson(obj);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    // 安全打印对象为 JSON 字符串（调试用）
    public static String toString(Object obj) {
        if (obj == null) return "null";
        try {
            return GSON.toJson(obj);
        } catch (Exception e) {
            return obj.toString(); // fallback，防止 Gson 崩溃
        }
    }


    // JSON 转对象
    public static <T> T fromJson(String json, Class<T> clazz) {
        try {
            return GSON.fromJson(json, clazz);
        } catch (JsonSyntaxException e) {
            e.printStackTrace();
            return null;
        }
    }

    // JSON 转任意类型（支持 List<T>、Map<K,V> 等）
    public static <T> T fromJson(String json, Type typeOfT) {
        try {
            return GSON.fromJson(json, typeOfT);
        } catch (JsonSyntaxException e) {
            e.printStackTrace();
            return null;
        }
    }

    // JSON 转 List<T>
    public static <T> List<T> fromJsonToList(String json, Class<T> clazz) {
        Type type = TypeToken.getParameterized(List.class, clazz).getType();
        return fromJson(json, type);
    }

    public static <T> ArrayList<T> fromJsonToArrayList(String json, Class<T> clazz) {
        Type type = TypeToken.getParameterized(ArrayList.class, clazz).getType();
        return fromJson(json, type);
    }

    // JSON 转 Map<String, T>
    public static <T> Map<String, T> fromJsonToMap(String json, Class<T> clazz) {
        Type type = TypeToken.getParameterized(Map.class, String.class, clazz).getType();
        return fromJson(json, type);
    }
}
